﻿//===========================================================================================================================
// Cuberry - http://www.cuberry.net
// Copyright (c) 2012
// by Peacequare® - Amir Moussa
//===========================================================================================================================
// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License 
// as published by the Free Software Foundation, either version 3 of the License, or any later version.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions 
// of the Software.
//
// This program is distributed in the hope that it will be useful.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.
//
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//===========================================================================================================================

using System;
using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;


namespace P2.Cuberry.Framework.Helper
{
    /// <summary>
    /// Interaction logic for P2StatusStrip.xaml
    /// </summary>
    public partial class P2StatusStrip : UserControl
    {

        protected P2MessageStack myMessageStack = new P2MessageStack();
        public string Status { get; set; }

        public P2StatusStrip()
        {
            InitializeComponent();

            this.statusMessage.Content = String.Empty;
            myMessageStack.Clear();
        }


        public P2MessageStack MessageStack2
        {
            get { return (P2MessageStack)GetValue(MessageStack2Property); }
            set { SetValue(MessageStack2Property, value);
            myMessageStack = value;
            myMessageStack.CollectionChanged += NotifyCollectionChangedEventHandler;
            NotifyCollectionChangedEventHandler(null, null);
            }
        }

        
        // Using a DependencyProperty as the backing store for MessageStack2.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MessageStack2Property =
            DependencyProperty.Register("MessageStack2", typeof(P2MessageStack), typeof(P2StatusStrip), new UIPropertyMetadata(new P2MessageStack(), new PropertyChangedCallback(OnIconColorChanged)));
        

        public P2MessageStack MessageStack
        {
            get
            {
                return myMessageStack;
            }
            set
            {
                myMessageStack = value;
                myMessageStack.CollectionChanged += NotifyCollectionChangedEventHandler;
                NotifyCollectionChangedEventHandler(null, null);                
            }
        }
        

        public static readonly DependencyProperty IconColorProperty =
        DependencyProperty.Register(
            "MessageStack", typeof(P2MessageStack), typeof(P2StatusStrip),
            new FrameworkPropertyMetadata(new P2MessageStack(), new PropertyChangedCallback(OnIconColorChanged)));
        
        
        private static void OnIconColorChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            // When the color changes, set the icon color
            P2StatusStrip control = (P2StatusStrip)obj;
            control.MessageStack = (P2MessageStack) args.NewValue;
        }


        public void NotifyCollectionChangedEventHandler(Object sender, NotifyCollectionChangedEventArgs e)
        {
            P2TransactionMessage resultMsg = myMessageStack.StatusMessage;
            setStatus(resultMsg.TransactionStatus, resultMsg.MessageText);
        }


        public void setStatus(string myStatus, string statusText)
        {
            try
            {
                BitmapImage myBitmapImage = new BitmapImage();

                // BitmapImage.UriSource must be in a BeginInit/EndInit block
                myBitmapImage.BeginInit();
                
                myBitmapImage.DecodePixelWidth = 42;

                switch (myStatus)
                {
                    case "green":

                        myBitmapImage.UriSource = new Uri(@"../Resources/statusGreen.gif", UriKind.Relative);
                        break;

                    case "yellow":
                        myBitmapImage.UriSource = new Uri(@"../Resources/statusYellow.gif", UriKind.Relative);
                        break;

                    case "red":
                        myBitmapImage.UriSource = new Uri(@"../Resources/statusRed.gif", UriKind.Relative);
                        break;

                    default:
                        myBitmapImage.UriSource = new Uri(@"../Resources/statusWhite.gif", UriKind.Relative);
                        break;
                }

                this.statusImage.Source = myBitmapImage;
                Status = myStatus;
                myBitmapImage.EndInit();
                this.statusMessage.Content = statusText;
            }
            catch (System.Exception ex) //AM:TC
            {
                P2ExceptionHandler.LogException(ex, string.Format("{0}.{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
        }


        public void addStatusBlock(P2MessageStack MessageBlock)
        {
            try
            {
                myMessageStack.Clear();
                myMessageStack.AddRange(MessageBlock);
                P2TransactionMessage tempMsg = new P2TransactionMessage("", "");

                foreach (var msg in myMessageStack)
                {
                    if (tempMsg.TransactionStatus == "") tempMsg = msg;
                    if (msg.TransactionStatus == "red")
                    {
                        tempMsg = msg;
                        break;
                    }
                    if (msg.TransactionStatus == "yellow" && tempMsg.TransactionStatus == "green")
                    {
                        tempMsg = msg;
                    }

                }
                setStatus(tempMsg.TransactionStatus, tempMsg.MessageText);
            }
            catch (System.Exception ex) //AM:TC
            {
                P2ExceptionHandler.LogException(ex, string.Format("{0}.{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
            }
        }


        private void statusMessage_DoubleClick(object sender, EventArgs e)
        {        
            P2Validator.YellowErrorDialog.Confirm(P2Translator.GetResource("Status Message Details"),"", myMessageStack, null, null);            
        }
        

    }
}

